Op deze pagina vind je enkele demonstraties van hoe je R kan gebruiken om data te visualiseren.

Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.

De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.



1 Doel

Visualiseren helpt om inzicht te krijgen in data. Onderzoekers gebruiken visualisaties vaak in de verkennende fase van een studie, als manier om zich een eerste indruk te vormen van een dataset. Het kan eveneens nuttig - soms zelfs noodzakelijk - zijn wanneer je de resultaten van je studie wil communiceren naar je doelpubliek.

Op deze pagina focussen we op de praktische kant: hoe kan je data visualiseren met R? Er zijn al heel wat mogelijkheden met de basisversie van R (“base R”). Hieronder vind je voorbeelden van wat je daarmee kan bereiken. Daarnaast bestaat er ook een package ggplot2 dat speciaal ontworpen is met het oog op datavisualisatie. Dat biedt nog meer mogelijkheden, maar is ook wat moeilijker om aan te leren. ggplot2 wordt elders gedemonstreerd.

Hieronder vind je voorbeelden van verschillende types visualisaties (histogram, boxplot, enz.). Er is geen ellenlange uitleg voorzien bij elk type. Soms vind je in het lichtblauwe blok telkens wat commentaar bij de code zelf (rechts van de #).



2 De dataset

De dataset enquete bevat gegevens van 14 variabelen geobserveerd bij 42 Amerikaanse studenten die een vak statistiek volgen. Deze dataset is gebaseerd op een dataset die hier wordt beschreven.

Deze dataset kan je inladen met de functie read.csv(). De data kan je best meteen in een object enquete onderbrengen zodat je die later makkelijk opnieuw kan oproepen.

enquete <- read.csv("https://statlas.ugent.be/datasets/enquete_vis.csv")


Je kan het dataframe enquete beginnen verkennen met bijvoorbeeld de functie str().

str(enquete)
'data.frame':   42 obs. of  14 variables:
 $ Index         : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Sectie        : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Jaar          : chr  "Vierde jaar" "Eerste jaar" "Eerste jaar" "Eerste jaar" ...
 $ Geslacht      : chr  "Vrouw" "Vrouw" "Vrouw" "Man" ...
 $ Afstand       : num  644 724 4828 161 3219 ...
 $ Lengte        : num  157 155 155 183 175 ...
 $ Dominante.hand: chr  "Rechts" "Links" "Rechts" "Rechts" ...
 $ Munten        : num  1.12 29 1.5 0.07 0.12 8 0.77 0 0 0 ...
 $ Wit.koord     : num  106.7 114.3 55.9 101.6 121.9 ...
 $ Zwart.koord   : num  15.2 12.7 10.2 10.2 17.8 ...
 $ Lezen         : num  80 100 100 50 200 100 200 100 100 100 ...
 $ Tv            : num  3 10 4 25 5 0 2 2 20 20 ...
 $ Hartslag      : int  71 78 80 63 63 56 72 66 54 48 ...
 $ Berichten     : int  3 100 2 200 100 1 50 30 40 25 ...

In de output zie je dat er verschillende types variabelen te vinden zijn in enquete. De types int en num staan beide voor metrische variabelen. chr slaat op tekstuele informatie. Dat zie je ook aan de aanhalingstekens rondom de waarden voor deze variabelen.

Eigenlijk is het gebruik van chr niet ideaal. Dit datatype is meer geschikt voor eigennamen, zoals voor- en familienamen van individuen. Wanneer een vector waarden van een categorische variabele bevat kan je beter opteren voor het datatype factor.

Een vector omzetten van type chr naar type factor is eenvoudig. Hieronder doen we dat voor alle chr variabelen in de dataset.

enquete$Jaar <- factor(enquete$Jaar)
enquete$Geslacht <- factor(enquete$Geslacht)
enquete$Dominante.hand <- factor(enquete$Dominante.hand)



3 Histogram

Een histogram laat je toe om de verdeling van een continue variabele weer te geven. Hieronder gaat het om de afstand die studenten moeten afleggen om op hun campus te raken.

hist(enquete$Afstand)


De waarden van de continue variabele worden in klassen ingedeeld. Het aantal klassen en/of de grenswaarden tussen de klassen kan je zelf controleren.

hist(enquete$Afstand, breaks = 4) # kies het aantal klassen

hist(enquete$Afstand, breaks = c(0, 20000, 40000, 60000)) # bepaal de klassengrenzen

hist(enquete$Afstand, breaks = seq(from=0, to=60000, by=1000)) # bepaal de klassengrenzen



4 Staafdiagram

Staafdiagrammen tonen de frequentie van de waarden van een categorische variabele, in dit geval de dominante hand. De functie daarvoor heet barplot(). Aan deze functie kan je niet gewoon de categorische variabele zelf geven. Dat leidt tot een foutmelding.

barplot(enquete$Dominante.hand)
Error in barplot.default(enquete$Dominante.hand): 'height' must be a vector or a matrix


In plaats daarvan gebruik je eerst de functie table() om de frequenties te bekomen.

barplot(table(enquete$Dominante.hand))



5 Boxplot

De functie boxplot() levert niet zo verrassend een boxplot op. Hieronder gaat het om het aantal berichten dat een student de voorbije 24 uur heeft gestuurd.

boxplot(enquete$Berichten) 


De plot hierboven heeft een nadeel. De centrale “box” van de boxplot is wat samengepropt onderaan de figuur. Dat komt door enkele observaties met extreem hoge waarden (uitschieters). Het is mogelijk om meer te focussen op de regio waar het overgrote deel van de gevallen zich bevinden, namelijk tussen waarden 0 en 100. Daartoe passen we gewoon de grenzen van de verticale as aan met het argument ylim.

boxplot(enquete$Berichten, ylim=c(0,100))


Merk op dat de uitschieters nu buiten de plot vallen maar wel nog in de dataset zitten. De boxplot zelf is dus op geen enkele manier veranderd!



6 Meerdere boxplots

Het kan ook interessant zijn om de verdeling van een variabele in verschillende groepen met elkaar te vergelijken. Daartoe kan je meerdere boxplots naast elkaar plaatsen in dezelfde grafiek. Bijvoorbeeld, om de verdeling van het aantal gestuurde berichten (Berichten) te vergelijken tussen mannen en vrouwen (Geslacht) kan je onderstaande code gebruiken. De tilde ~ in het commando kan je lezen als “opgesplitst volgens …”.

boxplot(enquete$Berichten ~ enquete$Geslacht)


Opnieuw zijn de boxplots wat samengepropt. Dat kan je -indien gewenst- verhelpen met het argument ylim (zie ook hierboven)



7 Scatterplot

Om gegevens van twee continue variabelen weer te geven kan je een scatterplot gebruiken. Om te zien hoeveel uur per week de studenten spenderen aan kijken naar tv en hoeveel uur aan lezen kan je onderstaande code gebruiken.

plot(enquete$Tv, enquete$Lezen)


Het is mogelijk dat twee of meer studenten precies dezelfde waarde hebben voor zowel Tv als Lezen. In dat geval zullen ze in de scatterplot op dezelfde plaats terechtkomen. Het is bijgevolg niet duidelijk of een punt in de puntenwolk 1 observatie vertegenwoordigt, of 2 observaties of nog meer. Om dit probleem op te lossen kan je gebruik maken van de functie jitter(). Die voegt een zekere hoeveelheid willekeurige “ruis” toe aan de waarden. De hoeveelheid “ruis” controleer je met het argument amount.

plot(x=jitter(enquete$Tv, amount=0.4), y=jitter(enquete$Lezen, amount=1.5))

Je ziet onder andere in de rood gekleurde regio inderdaad dat er enkele punten “achter elkaar” verscholen zaten.


Zoals je het argument ylim eventueel kan gebruiken om te bepalen welk deel van de verticale as wordt getoond, zo kan je xlim gebruiken voor de horizontale as.

plot(enquete$Tv, enquete$Lezen, xlim=c(0,15), ylim=c(0,300))



8 Een grafiek afwerken

De functies hierboven bevatten vaak heel wat argumenten waarmee je de grafiek kan afwerken. Hieronder vind je code om een titel en astitels toe te voegen of aan te passen bij een scatterplot. (De argumenten staan onder elkaar voor de leesbaarheid.)

Bij de astitels kan je best ook de meeteenheid meegeven (indien van toepassing).

plot(x=enquete$Tv, 
     y=enquete$Lezen,
     main='Mijn titel',                   # hoofdtitel
     xlab='Tv kijken (uren per week)',    # titel voor horizontale as
     ylab='Lezen (pagina\'s per week)'    # titel voor verticale as
     )


Daarnaast heb je heel wat keuzes voor de presentatie van de informatie zelf. Deze grafische parameters kan je natuurlijk combineren met een titel en astitels.

plot(enquete$Tv, 
     enquete$Lezen, 
     pch=19,                              # kies het soort punt
     col='turquoise3',                    # kies de kleur
     cex=0.7                              # kies de grootte van het punt (waarden groter dan 1 vergroten het punt)
    )      


R heeft heel wat ingebouwde kleuren. De volledige lijst kan je opvragen door het commando colors() uit te voeren. Een overzicht waar je de kleuren erbij kan zien vind je hier.



9 Een scatterplot met kleur

Een grafiek kan informatie bevatten over meer dan twee variabelen. Bijvoorbeeld door gebruik te maken van kleur kan je een derde variabele afbeelden. Hieronder vind je code voor een scatterplot, waarbij de observaties worden opgedeeld volgens de waarden van een derde variabele. Die laatste is degene die wordt weergegeven aan de hand van kleuren.

plot(x=enquete$Tv, 
     y=enquete$Lezen,
     col=enquete$Jaar                        # deze variabele moet van type factor zijn
     )


Deze grafiek heeft nog wat verduidelijking nodig. De kleur van de verschillende punten is niet altijd even duidelijk omdat het ‘punt’ eigenlijk een holle cirkel is. Daarom veranderen we het type punt. Bovendien is het moeilijk te achterhalen wat elke kleur precies betekent. Daarom voegen we een legende toe.

plot(x=enquete$Tv, 
     y=enquete$Lezen,
     col=enquete$Jaar,
     pch=19
     )

legend('topright',                          # positie van de legende vastleggen. Kan ook met coördinaten x en y
       legend=unique(enquete$Jaar),
       fill=unique(enquete$Jaar))           # argument col kan ook, maar leidt soms tot problemen met de weergave


Hieronder vind je terug hoe je zelf kan bepalen welke kleuren worden gebruikt.

mijn.kleuren <- c('tomato', 'turquoise4', 'skyblue2', 'magenta3')   # specifieer evenveel kleuren als er niveaus zijn in de categorische variabele

plot(x=enquete$Tv, 
     y=enquete$Lezen,
     pch=19,
     col=mijn.kleuren[enquete$Jaar])

legend('topright',
       legend=unique(enquete$Jaar),
       fill=mijn.kleuren[unique(enquete$Jaar)]
)


10 Een plot exporteren

Wanneer je een grafiek hebt gemaakt zal je die misschien willen opslaan om later op te nemen in bijvoorbeeld een Worddocument of Powerpointpresentatie.

Je plot opslaan kan door die te creëren tussen twee commando’s:

  • png('titel.png')
  • dev.off()

Bijvoorbeeld,

png('mijngrafiek.png')

plot(x=enquete$Tv, y=enquete$Lezen, col=enquete$Jaar)

dev.off()


Het resultaat zal zijn dat in je working directory een bestand verschijnt met de naam “mijngrafiek.png”. Uiteraard kan je kiezen voor een andere naam dan “mijngrafiek”. De extensie “.png” is iets technisch dat verwijst naar het type afbeelding. Je kan dit eventueel ook veranderen, maar doorgaans is dat niet nodig of nuttig.



11 Meer info

In de beknopte demonstraties hierboven hebben we telkens maar een klein tipje van de sluier gelicht. Er zijn veel meer mogelijkheden. Sommige ervan vind je in deze “cheat sheet”. Ook Google of AI-chatbots kunnen je natuurlijk verderhelpen.